home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / snz128s / src / rmgroup.c < prev    next >
C/C++ Source or Header  |  1994-06-01  |  6KB  |  208 lines

  1. /*
  2.     SNEWS 2.0
  3.  
  4.     rmgroup - remove newsgroups from the active file, and delete the files
  5.  
  6.  
  7.     Copyright (C) 1991  John McCombs, Christchurch, NEW ZEALAND
  8.                         john@ahuriri.gen.nz
  9.                         PO Box 2708, Christchurch, NEW ZEALAND
  10.  
  11.     This program is free software; you can redistribute it and/or modify
  12.     it under the terms of the GNU General Public License, version 1, as
  13.     published by the Free Software Foundation.
  14.  
  15.     This program is distributed in the hope that it will be useful,
  16.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.     GNU General Public License for more details.
  19.  
  20.     See the file COPYING, which contains a copy of the GNU General
  21.     Public License.
  22.  
  23.  */
  24.  
  25. /*---------------------------- Source Control ------------------------------*/
  26.  
  27. /*
  28.  * $Id: RMGROUP.C,v 1.2 1994/02/05 18:48:42 gbj Exp user $
  29.  */
  30.  
  31. /****************************************************************************
  32. *   12 Jun 92   1.2     NJL Fix newsgroup text deletion                     *
  33. *   19 Jul 92   1.3      GT Extra parameter in find_news_group ().          *
  34. *   26 Aug 92   1.4     MSM Snews 1.90 (no changes)                         *
  35. *   20 Mar 93   1.5     MSM Remove newsgroups from the ng file              *
  36. *    3 Jun 93   1.6     MSM Snews 2                                         *
  37. *                           Make ng an optional file                        *
  38. *    2 Apr 94    1.7    MSM Suspend support                    *
  39. ****************************************************************************/
  40.  
  41. #include "defs.h"
  42. #include "locking.h"
  43.  
  44. #include <io.h>
  45. #include <fcntl.h>
  46.  
  47. INFO            my_stuff;
  48. SUSPEND        *suspend_head;
  49.  
  50.  
  51. /*---------------------------- main ---------------------------------------*/
  52. void            main(int argc, char *argv[])
  53. {
  54.  
  55.     /*
  56.      * Delete a newsgroup.
  57.      * 
  58.      * - delete the data and index files
  59.      * - re-write the active file, without that newsgroup, saving the
  60.      * old one as .bak
  61.      * 
  62.      * This program could be structured to run faster, but I have tried
  63.      * to do things so that if rmgroup croaks part way through, as little
  64.      * damage will be done as possible.
  65.      *
  66.      */
  67.  
  68.     int             i, sflag;
  69.     char            buf[256], buf2[256], *dir, *p;
  70.     ACTIVE         *gp;
  71.     FILE           *active_file, *new_active_file;
  72.     int             junk_flag;              /* nz - posting to junk */
  73.     SUSPEND        *sus;
  74.  
  75.  
  76.     if (argc > 1) {
  77.  
  78.         if (!load_stuff()) {
  79.             fprintf(stderr, "Couldn't read rc info\n");
  80.         }
  81.  
  82.         printf("Demon Internet Simple News Version %d.%02d [build %d]\n", rmj, rmm, rup);
  83.         printf("Remove Newsgroups.\n");
  84.         
  85.         load_active_file();
  86.         suspend_head = load_suspend();
  87.         close_active();
  88.  
  89.  
  90.         for (i = 1; i < argc; i++) {
  91.  
  92.             sflag = FALSE;
  93.  
  94.             /* check if on suspend list */
  95.             sus = suspend_head;
  96.             while (sus != NULL) {
  97.                 if (stricmp(sus->group, argv[i]) == 0) {
  98.                     fprintf(stderr, "rmgroup: %s is suspended, no action taken.\n",
  99.                         argv[i]);
  100.                     sflag = TRUE;
  101.                 }
  102.                 sus = sus->next;
  103.             }
  104.         
  105.             /* check that the group exists - also prevent del of 'junk' */
  106.  
  107.             gp = find_news_group(argv[i], &junk_flag);
  108.  
  109.             if ((stricmp(gp->group, "junk") != 0)  && (sflag == FALSE)) {
  110.  
  111.                 /* form the directory name */
  112.                 dir = make_news_group_name(argv[i]);
  113.                 unlink(dir);              /* was unlink(buf) */
  114.                 sprintf(buf, "%s.IDX", dir);
  115.                 unlink(buf);
  116.  
  117.                 printf("rmgroup: Newsgroup %s: \n\tfiles gone... ", argv[i]);
  118.  
  119.                 /* finally remove it from the active file */
  120.                 sprintf(buf, "%sactive", my_stuff.news_dir);
  121.                 if ((active_file = fopen(buf, "rb")) == NULL) {
  122.                     fprintf(stderr, "\nrmgroup: cannot open %s\n", buf);
  123.                     exit(1);
  124.                 }
  125.                 sprintf(buf, "%sactive.new", my_stuff.news_dir);
  126.                 if ((new_active_file = fopen(buf, "wb")) == NULL) {
  127.                     fprintf(stderr, "\nrmgroup: cannot create %s\n", buf);
  128.                     exit(1);
  129.                 }
  130.                 while (fgets(buf, 255, active_file) != NULL) {
  131.                     strcpy(buf2, buf);
  132.                     p = strtok(buf2, " \t");
  133.                     if (stricmp(argv[i], p) != 0) {
  134.                         if (fputs(buf, new_active_file) == EOF) {
  135.                             fprintf(stderr, "\nrmgroup: couldn't write new active file\n");
  136.                         }
  137.                     }
  138.                     else {
  139.                         printf("\n\tremoved from active file... ");
  140.                     }
  141.                 }
  142.  
  143.                 fclose(active_file);
  144.                 fclose(new_active_file);
  145.  
  146.                 /* rename the active to a .bak and the .new to the active */
  147.  
  148.                 sprintf(buf, "%sactive.bak", my_stuff.news_dir);
  149.                 unlink(buf);
  150.                 sprintf(buf2, "%sactive", my_stuff.news_dir);
  151.                 rename(buf2, buf);
  152.                 sprintf(buf, "%sactive.new", my_stuff.news_dir);
  153.                 rename(buf, buf2);
  154.  
  155.                 /* also remove it from the ng file */
  156.                 sprintf(buf, "%sng", my_stuff.news_dir);
  157.                 if ((active_file = fopen(buf, "rb")) == NULL) {
  158. /*                    fprintf(stderr, "\n\tpermission file ng does not exist\n"); */
  159.                 }
  160.                 else {
  161.                     sprintf(buf, "%sng.new", my_stuff.news_dir);
  162.                     if ((new_active_file = fopen(buf, "wb")) == NULL) {
  163.                         fprintf(stderr, "\nrmgroup: cannot create %s\n", buf);
  164.                         exit(1);
  165.                     }
  166.                     while (fgets(buf, 255, active_file) != NULL) {
  167.                         strcpy(buf2, buf);
  168.                         p = strtok(buf2, " \r\n");
  169.                         if (stricmp(argv[i], p) != 0) {
  170.                             if (fputs(buf, new_active_file) == EOF) {
  171.                                 fprintf(stderr, "\nrmgroup: couldn't write new ng file\n");
  172.                             }
  173.                         }
  174.                         else {
  175.                             printf("\n\tremoved from ng file\n");
  176.                         }
  177.                     }
  178.  
  179.                     fclose(active_file);
  180.                     fclose(new_active_file);
  181.  
  182.                     /* rename the active to a .bak and the .new to the active */
  183.  
  184.                     sprintf(buf, "%sng.bak", my_stuff.news_dir);
  185.                     unlink(buf);
  186.                     sprintf(buf2, "%sng", my_stuff.news_dir);
  187.                     rename(buf2, buf);
  188.                     sprintf(buf, "%sng.new", my_stuff.news_dir);
  189.                     rename(buf, buf2);
  190.                 }
  191.             }
  192.             else {
  193.                 if (sflag == FALSE)
  194.                     fprintf(stderr, "rmgroup: newsgroup %s not found\n", argv[1]);
  195.             }
  196.  
  197.         }
  198.  
  199.         close_active_file();
  200.         free_suspend(suspend_head);
  201.  
  202.     }
  203.     else {
  204.         printf("USAGE: rmgroup  newsgroup names....\n");
  205.     }
  206.  
  207. }
  208.